#include<stdio.h>
#include<stdlib.h>
typedef struct Single_Link_List Link_List_t;
typedef struct Single_Link_List* pLink_List_t;

struct Single_Link_List{
    int data;
    struct Single_Link_List* next;
};

//有空节点的链表
//头节点不存放数据
pLink_List_t Single_Link_List_Init() {

    pLink_List_t phead = (pLink_List_t)malloc(sizeof(Link_List_t));
    if (phead == NULL)
    {
        perror("malloc Single_Link_List fail");
        return phead;
    }
    (phead)->data = 0;
    (phead)->next = NULL;

    return phead;
}



pLink_List_t Create_new_node(int data){

    pLink_List_t pnew=(pLink_List_t)malloc(sizeof(Link_List_t));
    if(pnew==NULL)
    {
        perror("malloc a new node fail");
        return pnew;
    }
    pnew->data=data;
    pnew->next=NULL;
    return pnew;
}



#if 1
//头插
void Single_Link_List_Head_Insert(pLink_List_t phead, pLink_List_t node)
{
    pLink_List_t plink=phead;
   if(node==NULL)
   {
    perror("Head insert a node fail");
    return;
   }
   //判断是否首节点
   if(phead->next==NULL)
   {
    plink->next=node;
    node->next=NULL;
    return;
   }
   //头插
   node->next=phead->next;
   phead->next=node;
}

#endif

#if 1
//尾插
void Single_Link_List_Tail_Insert(pLink_List_t phead, pLink_List_t node)
{
    pLink_List_t plink = phead->next;
    if(node ==NULL)
    {
        perror("Tail Insert fail");
        return;
    }
    //判断有无首节点
    if(phead->next==NULL)
    {
        plink=node;
        return;
    }

    //指针移到最后一个节点
    while(plink->next!=NULL)
    {
        plink=plink->next;
    }
    plink->next=node;
    node->next=NULL;
}
#endif

#if 1
//头删
void Single_link_List_Head_Delet(pLink_List_t phead)
{
    //是否有首节点
    if(phead->next==NULL)
    {
        return;
    }

    pLink_List_t plink=phead->next;
    pLink_List_t temp=phead->next->next;

    free(plink);
    phead->next=temp;

}
#endif

#if 1
//尾删
void Single_link_List_Tail_Delet(pLink_List_t phead)
{
    //判断是否有首节点
    if(phead->next==NULL)
    {
        printf("链表不存在首节点");
        return;
    }

    //判断是否只剩首节点了
    if(phead->next->next==NULL)
    {
        free(phead->next);
        phead->next=NULL;
        return;
    }

    pLink_List_t plink=phead->next;
    pLink_List_t ptemp=NULL;
  
    while(plink->next->next!=NULL)
    {
        plink=plink->next;     
    }
    ptemp=plink->next;
    free(ptemp);
    plink->next=NULL;
    
}
#endif

#if 1
//查找数据
void Single_Link_List_Search(pLink_List_t phead,int data)
{
    if(phead->next==NULL){
        printf("链表无节点");
        return;
    }

    pLink_List_t plink=phead->next;

    while(plink!=NULL)
    {
        if(plink->data==data)
        {
            printf("已经找到数据%d\n",plink->data);
            return;
        }
        plink=plink->next;
    }

    if(plink==NULL)
    {
        printf("链表中找不到此数据\n");
        return;
    }

}
#endif

#if 1
//修改数据
void Single_Link_List_Modify(pLink_List_t phead,int data,int modified_data)
{
    if(phead->next==NULL){
        printf("链表无节点");
        return;
    }

    pLink_List_t plink=phead->next;

    while(plink!=NULL)
    {
        if(plink->data==data)
        {
            plink->data=modified_data;
            return;
        }
        plink=plink->next;
    }

    if(plink==NULL)
    {
        printf("链表中找不到此数据\n");
        return;
    }

}
#endif

#if 1
//遍历链表
void Print_Link_List(pLink_List_t phead)
{
    pLink_List_t plink=phead->next;

    if(plink==NULL)
    {
        perror("None Link List");
        return;
    }

    while(plink!=NULL)
    {
        printf("%d  ",plink->data);
        plink=plink->next;
    }
    printf("\n");

}
#endif

#if 1
//释放链表
void Release_Link_list(pLink_List_t phead)
{
    pLink_List_t plink=phead->next;
    pLink_List_t ptemp=NULL;
    
    while(plink!=NULL)
    {
        ptemp=plink->next;
        free(plink);
        plink=ptemp;;
    }
    free(phead);
    printf("链表已经全部释放\n");
}
#endif


int main(){
    pLink_List_t phead = NULL;
    phead=Single_Link_List_Init();
    Single_Link_List_Head_Insert(phead,Create_new_node(1));
    Single_Link_List_Head_Insert(phead,Create_new_node(2));
    Single_Link_List_Head_Insert(phead,Create_new_node(3));
    Single_Link_List_Head_Insert(phead,Create_new_node(4));
    Single_Link_List_Head_Insert(phead,Create_new_node(5));
    Single_Link_List_Tail_Insert(phead,Create_new_node(6));
    Single_Link_List_Tail_Insert(phead,Create_new_node(7));
    Single_Link_List_Tail_Insert(phead,Create_new_node(8));
    Single_Link_List_Tail_Insert(phead,Create_new_node(9));
    Single_Link_List_Tail_Insert(phead,Create_new_node(10));
    Print_Link_List(phead);
    
    Single_Link_List_Search(phead,5);
    Single_Link_List_Search(phead,1);
    Single_Link_List_Search(phead,10);
    Single_Link_List_Search(phead,11);
    Single_Link_List_Modify(phead,6,12);
    Print_Link_List(phead);
    Release_Link_list(phead);
    phead=NULL;
    return 0;
}